package com.woniuxy.controller;

import com.woniuxy.entity.AllShop;
import com.woniuxy.entity.DTO.ShopQueryDTO;
import com.woniuxy.service.IShopService;
import com.woniuxy.util.PageResult;
import com.woniuxy.util.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author pml
 * @Date 2025/7/16 10:05
 * @Description 商品管理控制器
 * 处理商品相关的所有HTTP请求，提供RESTful API接口
 */
@RestController
@RequestMapping("/shop")
public class ShopController {

    @Autowired
    private IShopService shopService;

    /**
     * 分页多条件查询商品列表
     * 使用GET请求，参数通过查询字符串传递，符合RESTful最佳实践
     */
    @GetMapping("/list")
    public ResponseData<PageResult<AllShop>> getShopList(ShopQueryDTO queryDTO) {
        PageResult<AllShop> pageResult = shopService.getShopList(queryDTO);
        return ResponseData.ok(pageResult);
    }

    /**
     * 根据ID查询单个商品
     * 路径参数方式传递商品ID，清晰直观
     */
    @GetMapping("/{shopId}")
    public ResponseData<AllShop> getShopById(@PathVariable Integer shopId) {
        AllShop shop = shopService.getById(shopId);
        return ResponseData.ok(shop);
    }

    /**
     * 新增商品
     * 使用POST请求，JSON格式传递商品信息
     * 自动设置创建时间和状态默认值
     */
    @PostMapping
    public ResponseData addShop(@RequestBody AllShop shop) {
        // 设置初始状态为上架
        // 新发布商品默认为上架状态，符合业务逻辑
        shop.setStatus(1);
        boolean success = shopService.save(shop);
        return success ? ResponseData.ok() : ResponseData.fail(500, "新增商品失败");
    }

    /**
     * 更新商品信息
     * 使用PUT请求，JSON格式传递更新信息
     * 全量更新，需传递完整的商品信息
     */
    @PutMapping
    public ResponseData updateShop(@RequestBody AllShop shop) {
        boolean success = shopService.updateById(shop);
        return success ? ResponseData.ok() : ResponseData.fail(500, "更新商品失败");
    }

    /**
     * 根据ID删除单个商品
     * 使用DELETE请求，路径参数传递商品ID
     * 实际为逻辑删除，更新status字段为2（下架）
     */
    @DeleteMapping("/{shopId}")
    public ResponseData deleteShop(@PathVariable("shopId") Integer shopId) {
        AllShop shop = new AllShop();
        shop.setId(shopId);
        shop.setStatus(2); // 2表示下架状态
        boolean success = shopService.updateById(shop);
        return success ? ResponseData.ok() : ResponseData.fail(500, "删除商品失败");
    }

    /**
     * 批量删除商品
     * 使用DELETE请求，请求体传递商品ID列表
     * 批量操作提高效率，减少前端请求次数
     */
    @DeleteMapping("/batch")
    public ResponseData batchDeleteShop(@RequestBody List<Integer> shopIds) {
        // 批量更新状态为下架
        boolean success = shopIds.stream().allMatch(id -> {
            AllShop shop = new AllShop();
            shop.setId(id);
            shop.setStatus(2);
            return shopService.updateById(shop);
        });
        return success ? ResponseData.ok() : ResponseData.fail(500, "批量删除失败");
    }

    // 获取上架商品总数
    @GetMapping("/count/online")
    public ResponseData<Long> countOnlineShops() {
        long count = shopService.countOnlineShops();
        return ResponseData.ok(count);
    }
}